﻿package core.resource
{
    import flash.system.*;

    public class GUID extends Object
    {
        private static var counter:Number = 0;

        public function GUID()
        {
            return;
        }// end function

        public static function Create() : String
        {
            var _loc_1:* = new Date();
            var _loc_2:* = _loc_1.getTime();
            var _loc_3:* = Math.random() * Number.MAX_VALUE;
            var _loc_4:* = Capabilities.serverString;
            var _loc_5:* = calculate(_loc_2 + _loc_4 + _loc_3 + counter++).toUpperCase();
            var _loc_6:* = _loc_5.substring(0, 8) + "-" + _loc_5.substring(8, 12) + "-" + _loc_5.substring(12, 16) + "-" + _loc_5.substring(16, 20) + "-" + _loc_5.substring(20, 32);
            return _loc_6;
        }// end function

        private static function calculate(http://adobe.com/AS3/2006/builtin:String) : String
        {
            return hex_sha1(http://adobe.com/AS3/2006/builtin);
        }// end function

        private static function hex_sha1(http://adobe.com/AS3/2006/builtin:String) : String
        {
            return binb2hex(core_sha1(str2binb(http://adobe.com/AS3/2006/builtin), http://adobe.com/AS3/2006/builtin.length * 8));
        }// end function

        private static function core_sha1(serverString:Array, serverString:Number) : Array
        {
            var _loc_3:Number = NaN;
            var _loc_4:Number = NaN;
            var _loc_5:Number = NaN;
            var _loc_6:Number = NaN;
            var _loc_7:Number = NaN;
            var _loc_8:Number = NaN;
            var _loc_9:Number = NaN;
            serverString[serverString >> 5] = serverString[serverString >> 5] | 128 << 24 - serverString % 32;
            serverString[(serverString + 64 >> 9 << 4) + 15] = serverString;
            var _loc_10:* = new Array(80);
            var _loc_11:Number = 1732584193;
            var _loc_12:Number = -271733879;
            var _loc_13:Number = -1732584194;
            var _loc_14:Number = 271733878;
            var _loc_15:Number = -1009589776;
            var _loc_16:Number = 0;
            while (_loc_16 < serverString.length)
            {
                
                _loc_3 = _loc_11;
                _loc_4 = _loc_12;
                _loc_5 = _loc_13;
                _loc_6 = _loc_14;
                _loc_7 = _loc_15;
                _loc_8 = 0;
                while (_loc_8 < 80)
                {
                    
                    if (_loc_8 < 16)
                    {
                        _loc_10[_loc_8] = serverString[_loc_16 + _loc_8];
                    }
                    else
                    {
                        _loc_10[_loc_8] = rol(_loc_10[_loc_8 - 3] ^ _loc_10[_loc_8 - 8] ^ _loc_10[_loc_8 - 14] ^ _loc_10[_loc_8 - 16], 1);
                    }
                    _loc_9 = safe_add(safe_add(rol(_loc_11, 5), sha1_ft(_loc_8, _loc_12, _loc_13, _loc_14)), safe_add(safe_add(_loc_15, _loc_10[_loc_8]), sha1_kt(_loc_8)));
                    _loc_15 = _loc_14;
                    _loc_14 = _loc_13;
                    _loc_13 = rol(_loc_12, 30);
                    _loc_12 = _loc_11;
                    _loc_11 = _loc_9;
                    _loc_8 = _loc_8 + 1;
                }
                _loc_11 = safe_add(_loc_11, _loc_3);
                _loc_12 = safe_add(_loc_12, _loc_4);
                _loc_13 = safe_add(_loc_13, _loc_5);
                _loc_14 = safe_add(_loc_14, _loc_6);
                _loc_15 = safe_add(_loc_15, _loc_7);
                _loc_16 = _loc_16 + 16;
            }
            return new Array(_loc_11, _loc_12, _loc_13, _loc_14, _loc_15);
        }// end function

        private static function sha1_ft(_local2:Number, _local2:Number, _local2:Number, _local2:Number) : Number
        {
            if (_local2 < 20)
            {
                return _local2 & _local2 | ~_local2 & _local2;
            }
            if (_local2 < 40)
            {
                return _local2 ^ _local2 ^ _local2;
            }
            if (_local2 < 60)
            {
                return _local2 & _local2 | _local2 & _local2 | _local2 & _local2;
            }
            return _local2 ^ _local2 ^ _local2;
        }// end function

        private static function sha1_kt(_local2:Number) : Number
        {
            return _local2 < 20 ? (1518500249) : (_local2 < 40 ? (1859775393) : (_local2 < 60 ? (-1894007588) : (-899497514)));
        }// end function

        private static function safe_add(_local2:Number, _local2:Number) : Number
        {
            var _loc_3:* = (_local2 & 65535) + (_local2 & 65535);
            var _loc_4:* = (_local2 >> 16) + (_local2 >> 16) + (_loc_3 >> 16);
            return _loc_4 << 16 | _loc_3 & 65535;
        }// end function

        private static function rol(_local2:Number, _local2:Number) : Number
        {
            return _local2 << _local2 | _local2 >>> 32 - _local2;
        }// end function

        private static function str2binb(serverString:String) : Array
        {
            var _loc_2:* = new Array();
            var _loc_3:* = (1 << 8) - 1;
            var _loc_4:Number = 0;
            while (_loc_4 < serverString.length * 8)
            {
                
                _loc_2[_loc_4 >> 5] = _loc_2[_loc_4 >> 5] | (serverString.charCodeAt(_loc_4 / 8) & _loc_3) << 24 - _loc_4 % 32;
                _loc_4 = _loc_4 + 8;
            }
            return _loc_2;
        }// end function

        private static function binb2hex(http://adobe.com/AS3/2006/builtin:Array) : String
        {
            var _loc_2:* = new String("");
            var _loc_3:* = new String("0123456789abcdef");
            var _loc_4:Number = 0;
            while (_loc_4 < http://adobe.com/AS3/2006/builtin.length * 4)
            {
                
                _loc_2 = _loc_2 + (_loc_3.charAt(http://adobe.com/AS3/2006/builtin[_loc_4 >> 2] >> (3 - _loc_4 % 4) * 8 + 4 & 15) + _loc_3.charAt(http://adobe.com/AS3/2006/builtin[_loc_4 >> 2] >> (3 - _loc_4 % 4) * 8 & 15));
                _loc_4 = _loc_4 + 1;
            }
            return _loc_2;
        }// end function

    }
}
